
let eventSource = null;
let reconnectAttempts = 0; // 重连次数
/**
 * EventSource自动连接的原因
 * EventSource（SSE）本身并没有提供自动重连的机制，它所谓的自动重连特性是指浏览器自动处理与服务器的连接断开并尝试重新连接的过程。
 * readyState 0 连接中 1 已连接 2 已关闭
 */
export default function subscribeWarnMsg(url) {
    if(typeof (EventSource) == 'undefined') return // 浏览器不支持使用EventSource接收服务器推送事件
    return new Promise((resolve,reject) => {
        if (eventSource) {
            resolve(eventSource)
        } else {
            eventSource = new EventSource(import.meta.env.VITE_APP_BASE_API + url)
            eventSource.onopen = function (e) {
                console.log(e.target, "连接刚打开时触发");
                reconnectAttempts = 0; // 重置重连次数
                setTimeout(() => { // 需要异步来获取readyState的值,不然e.target.readyState获取到的值一直是1,无法来判断链接打开时的状态
                    // console.log(e.target.readyState,'e.target.readyState')
                    if(eventSource&&e.target.readyState==1) {
                        resolve(eventSource)
                    }
                });
            };
            eventSource.onmessage = (event) => {
                console.log("收到消息内容是:", event)
            };
            eventSource.onerror = (event) => {
                console.error("SSE 连接出错：", event);
                if(event.target.readyState==2) { // 使用 eventSource.readyState 属性来检查连接状态，避免和浏览器的自动连接重复重连
                    eventSource.close(); // 关闭连接
                    eventSource = null;
                    // 自动重连逻辑
                    reconnectAttempts++;
                    const reconnectDelay = Math.min(30000, 1000 * Math.pow(2, reconnectAttempts)); // 计算重连延迟，最大延迟为30秒
                    // console.log(`将在 ${reconnectDelay} 毫秒后尝试重连...`);
                    // 等待一定时间后重连
                    setTimeout(() => {
                        if (!eventSource) {
                            // console.log("尝试重连 SSE...");
                            subscribeWarnMsg(url); // 递归调用重连
                        }
                    }, reconnectDelay);
                }
            }
        }
    })
}